<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.23">
<meta name="description" content="Learn about the USBX Device Services.">
<title>Description of USBX Device Services</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.square{list-style-type:square}
ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child{border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active,#footnotes .footnote a:first-of-type:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article">
<div id="header">
<h1>Description of USBX Device Services</h1>
</div>
<div id="content">
<h3 id="_ux_device_stack_alternate_setting_get" class="discrete">ux_device_stack_alternate_setting_get</h3>
<div class="paragraph">
<p>Get current alternate setting for an interface value</p>
</div>
<h3 id="_prototype" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_alternate_setting_get(ULONG interface_value);</code></pre>
</div>
</div>
<h3 id="_description" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is used by the USB host to obtain the current alternate setting for a specific interface value. It is called by the controller driver when a <strong>GET_INTERFACE</strong> request is received, to start data stage of the control transfer in background, and return immediately.</p>
</div>
<h3 id="_input_parameter" class="discrete">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>Interface_value</em>: Interface value for which the current alternate setting is queried</p>
</li>
</ul>
</div>
<h3 id="_return_values" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The data transfer was completed.</p>
</li>
<li>
<p><strong>UX_ERROR</strong> (0xFF) Wrong interface value.</p>
</li>
</ul>
</div>
<h3 id="_example" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">ULONG interface_value;
UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_alternate_setting_get(interface_value);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_alternate_setting_set" class="discrete">ux_device_stack_alternate_setting_set</h3>
<div class="paragraph">
<p>Set current alternate setting for an interface value</p>
</div>
<h3 id="_prototype_2" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_alternate_setting_set(
    ULONG interface_value,
    ULONG alternate_setting_value);</code></pre>
</div>
</div>
<h3 id="_description_2" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is used by the USB host to set the current alternate setting for a specific interface value. It is called by the controller driver when a <strong>SET_INTERFACE</strong> request is received. When the <strong>SET_INTERFACE</strong> is completed, the values of the alternate settings are applied to the class.</p>
</div>
<div class="paragraph">
<p>The device stack will issue a <strong>UX_SLAVE_CLASS_COMMAND_CHANGE</strong> to the class that owns this interface to reflect the change of alternate setting.</p>
</div>
<div class="paragraph">
<p>The function starts status stage of the control transfer in background, and return immediately.</p>
</div>
<h3 id="_parameters" class="discrete">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>interface_value</em>: Interface value for which the current alternate setting is set.</p>
</li>
<li>
<p><em>alternate_setting_value</em>: The new alternate setting value.</p>
</li>
</ul>
</div>
<h3 id="_return_values_2" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The data transfer was completed.</p>
</li>
<li>
<p><strong>UX_INTERFACE_HANDLE_UNKNOWN</strong> (0x52) No interface attached.</p>
</li>
<li>
<p><strong>UX_FUNCTION_NOT_SUPPORTED</strong> (0x54) Device is not configured.</p>
</li>
<li>
<p><strong>UX_ERROR</strong> (0xFF) Wrong interface value.</p>
</li>
</ul>
</div>
<h3 id="_example_2" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">ULONG interface_value;

ULONG alternate_setting_value;

/* The following example illustrates this service. */
status = ux_device_stack_alternate_setting_set(interface_value, alternate_setting_value);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_class_register" class="discrete">ux_device_stack_class_register</h3>
<div class="paragraph">
<p>Register a new USB device class</p>
</div>
<h3 id="_prototype_3" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_class_register(
    UCHAR *class_name,
    UINT (*class_entry_function)(struct UX_SLAVE_CLASS_COMMAND_STRUCT *),
    ULONG configuration_number,
    ULONG interface_number,
    VOID *parameter);</code></pre>
</div>
</div>
<h3 id="_description_3" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is used by the application to register a new USB device class. This registration starts a class container and not an instance of the class and returns immediately. A class should have an active thread and be attached to a specific interface.</p>
</div>
<div class="paragraph">
<p>Some classes expect a parameter or parameter list. For instance, the device storage class would expect the geometry of the storage device it is trying to emulate. The parameter field is therefore dependent on the class requirement and can be a value or a pointer to a structure filled with the class values.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
The C string of class_name must be NULL-terminated and the length of it (without the NULL-terminator itself) must be no larger than <strong>UX_MAX_CLASS_NAME_LENGTH</strong>.
</td>
</tr>
</table>
</div>
<h3 id="_parameters_2" class="discrete">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>class_name</em>: Class Name</p>
</li>
<li>
<p><em>class_entry_function</em>: The entry function of the class.</p>
</li>
<li>
<p><em>configuration_number</em>: The configuration number this class is attached to.</p>
</li>
<li>
<p><em>interface_number</em>: The interface number this class is attached to.</p>
</li>
<li>
<p><em>parameter</em>: A pointer to a class specific parameter list.</p>
</li>
</ul>
</div>
<h3 id="_return_values_3" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The class was registered</p>
</li>
<li>
<p><strong>UX_MEMORY_INSUFFICIENT</strong> (0x12) No entries left in class table.</p>
</li>
<li>
<p><strong>UX_THREAD_ERROR</strong> (0x16) Cannot create a class thread.</p>
</li>
</ul>
</div>
<h3 id="_example_3" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates this service. */

/* Initialize the device storage class. The class is connected with interface 1 */
status = ux_device_stack_class_register(_ux_system_slave_class_storage_name ux_device_class_storage_entry,
    1, 1, (VOID *)&amp;parameter);</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_class_unregister" class="discrete">ux_device_stack_class_unregister</h3>
<div class="paragraph">
<p>Unregister a USB device class</p>
</div>
<h3 id="_prototype_4" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_class_unregister(
    UCHAR *class_name,
    UINT (*class_entry_function)(struct UX_SLAVE_CLASS_COMMAND_STRUCT*));</code></pre>
</div>
</div>
<h3 id="_description_4" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is used by the application to unregister a USB device class and returns immediately.</p>
</div>
<div class="paragraph">
<p>The device stack will issue a <strong>UX_SLAVE_CLASS_COMMAND_UNINITIALIZE</strong> to the class to uninitialized.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
The C string of class_name must be NULL-terminated and the
length of it (without the NULL-terminator itself) must be no larger than <strong>UX_MAX_CLASS_NAME_LENGTH</strong>.
</td>
</tr>
</table>
</div>
<h3 id="_parameters_3" class="discrete">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>class_name</em>: Class Name</p>
</li>
<li>
<p><em>class_entry_function</em>: The entry function of the class.</p>
</li>
</ul>
</div>
<h3 id="_return_values_4" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The class was unregistered.</p>
</li>
<li>
<p><strong>UX_NO_CLASS_MATCH</strong> (0x57) The class isn&#8217;t registered.</p>
</li>
</ul>
</div>
<h3 id="_example_4" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">/* The following example illustrates this service. */

/* Unitialize the device storage class. */
status = ux_device_stack_class_unregister(_ux_system_slave_class_storage_name, ux_device_class_storage_entry);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_configuration_get" class="discrete">ux_device_stack_configuration_get</h3>
<div class="paragraph">
<p>Get the current configuration</p>
</div>
<h3 id="_prototype_5" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_configuration_get(VOID);</code></pre>
</div>
</div>
<h3 id="_description_5" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is used by the host to obtain the current configuration running in the device. It is called by the controller driver when a GET_CONFIGURATION request is received.  It starts data stage of the control transfer in background, and returns immediately.</p>
</div>
<h3 id="_input_parameter_2" class="discrete">Input Parameter</h3>
<div class="paragraph">
<p>None</p>
</div>
<h3 id="_return_value" class="discrete">Return Value</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The data transfer was completed.</p>
</li>
</ul>
</div>
<h3 id="_example_5" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_configuration_get();

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_configuration_set" class="discrete">ux_device_stack_configuration_set</h3>
<div class="paragraph">
<p>Set the current configuration</p>
</div>
<h3 id="_prototype_6" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_configuration_set(ULONG configuration_value);</code></pre>
</div>
</div>
<h3 id="_description_6" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is used by the host to set the current configuration running in the device. Upon reception of this command, the USB device stack will activate the alternate setting 0 of each interface connected to this configuration.</p>
</div>
<div class="paragraph">
<p>The function issues protocol error or starts status stage of the control transfer in background, and return immediately.</p>
</div>
<h3 id="_input_parameter_3" class="discrete">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>configuration_value</em>: The configuration value selected by the host.</p>
</li>
</ul>
</div>
<h3 id="_return_value_2" class="discrete">Return Value</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The configuration was successfully set.</p>
</li>
</ul>
</div>
<h3 id="_example_6" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">ULONG configuration_value;
UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_configuration_set(configuration_value);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_descriptor_send" class="discrete">ux_device_stack_descriptor_send</h3>
<div class="paragraph">
<p>Send a descriptor to the host</p>
</div>
<h3 id="_prototype_7" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_descriptor_send(
    ULONG descriptor_type,
    ULONG request_index,
    ULONG host_length);</code></pre>
</div>
</div>
<h3 id="_description_7" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is used by the device side to return a descriptor to the host. This descriptor can be a device descriptor, a configuration descriptor or a string descriptor.</p>
</div>
<div class="paragraph">
<p>The function issues protocol error or starts data stage of the control transfer in background, and return immediately.</p>
</div>
<h3 id="_parameters_4" class="discrete">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>descriptor_type</em>: The type of the descriptor. Must be one of the following values.</p>
<div class="ulist">
<ul>
<li>
<p><strong>UX_DEVICE_DESCRIPTOR_ITEM</strong></p>
</li>
<li>
<p><strong>UX_CONFIGURATION_DESCRIPTOR_ITEM</strong></p>
</li>
<li>
<p><strong>UX_STRING_DESCRIPTOR_ITEM</strong></p>
</li>
<li>
<p><strong>UX_DEVICE_QUALIFIER_DESCRIPTOR_ITEM</strong></p>
</li>
<li>
<p><strong>UX_OTHER_SPEED_DESCRIPTOR_ITEM</strong></p>
</li>
</ul>
</div>
</li>
<li>
<p><em>request_index</em>: The index of the descriptor.</p>
</li>
<li>
<p><em>host_length</em>: The length required by the host.</p>
</li>
</ul>
</div>
<h3 id="_return_values_5" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The data transfer was completed.</p>
</li>
<li>
<p><strong>UX_ERROR</strong> (0xFF) The transfer was not completed.</p>
</li>
</ul>
</div>
<h3 id="_example_7" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">ULONG descriptor_type;
ULONG request_index;
ULONG host_length;
UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_descriptor_send(descriptor_type, request_index, host_length);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_disconnect" class="discrete">ux_device_stack_disconnect</h3>
<div class="paragraph">
<p>Disconnect device stack</p>
</div>
<h3 id="_prototype_8" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_disconnect(VOID);</code></pre>
</div>
</div>
<h3 id="_description_8" class="discrete">Description</h3>
<div class="paragraph">
<p>The VBUS manager calls this function when there is a device disconnection. The device stack will inform all classes registered to this device and will thereafter release all the device resources, and return immediately.</p>
</div>
<h3 id="_input_parameter_4" class="discrete">Input Parameter</h3>
<div class="paragraph">
<p>None</p>
</div>
<h3 id="_return_value_3" class="discrete">Return Value</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The device was disconnected.</p>
</li>
</ul>
</div>
<h3 id="_example_8" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_disconnect();

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_endpoint_stall" class="discrete">ux_device_stack_endpoint_stall</h3>
<div class="paragraph">
<p>Request endpoint Stall condition</p>
</div>
<h3 id="_prototype_9" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_endpoint_stall(UX_SLAVE_ENDPOINT*endpoint);</code></pre>
</div>
</div>
<h3 id="_description_9" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called by the USB device class when an endpoint should return a Stall condition to the host.</p>
</div>
<div class="paragraph">
<p>The function calls device controller driver to stall the endpoint, and return immediately.</p>
</div>
<h3 id="_input_parameter_5" class="discrete">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>endpoint</em>: The endpoint on which the Stall condition is requested.</p>
</li>
</ul>
</div>
<h3 id="_return_value_4" class="discrete">Return Value</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) This operation was successful.</p>
</li>
<li>
<p><strong>UX_ERROR</strong> (0xFF) The device is in an invalid state.</p>
</li>
</ul>
</div>
<h3 id="_example_9" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_endpoint_stall(endpoint);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_host_wakeup" class="discrete">ux_device_stack_host_wakeup</h3>
<div class="paragraph">
<p>Wake up the host</p>
</div>
<h3 id="_prototype_10" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_host_wakeup(VOID);</code></pre>
</div>
</div>
<h3 id="_description_10" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called when the device wants to wake up the host. This command is only valid when the device is in suspend mode. It is up to the device application to decide when it wants to wake up the USB host. For instance, a USB modem can wake up a host when it detects a RING signal on the telephone line.</p>
</div>
<div class="paragraph">
<p>The function calls device controller driver to issue the wakeup signal, and return immediately.</p>
</div>
<h3 id="_input_parameter_6" class="discrete">Input Parameter</h3>
<div class="paragraph">
<p>None</p>
</div>
<h3 id="_return_values_6" class="discrete">Return values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The call was successful.</p>
</li>
<li>
<p><strong>UX_FUNCTION_NOT_SUPPORTED</strong> (0x54) The call failed (the device was probably not in the suspended mode).</p>
</li>
<li>
<p><strong>UX_ERROR</strong> (0xFF) The call failed.</p>
</li>
</ul>
</div>
<h3 id="_example_10" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_host_wakeup();

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_initialize" class="discrete">ux_device_stack_initialize</h3>
<div class="paragraph">
<p>Initialize USB device stack</p>
</div>
<h3 id="_prototype_11" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_initialize(
    UCHAR *device_framework_high_speed,
    ULONG device_framework_length_high_speed,
    UCHAR *device_framework_full_speed,
    ULONG device_framework_length_full_speed,
    UCHAR *string_framework,
    ULONG string_framework_length,
    UCHAR *language_id_framework,
    ULONG language_id_framework_length),
    UINT (*ux_system_slave_change_function)(ULONG)));</code></pre>
</div>
</div>
<h3 id="_description_11" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called by the application to initialize the USB device stack. It does not initialize any classes or any controllers. This should be done with separate function calls. This call mainly provides the stack with the device framework for the USB function. It supports both high and full speeds with the possibility to have completely separate device framework for each speed. String framework and multiple languages are supported.</p>
</div>
<h3 id="_parameters_5" class="discrete">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>device_framework_high_speed</em>: Pointer to the high speed framework.</p>
</li>
<li>
<p><em>device_framework_length_high_speed</em>: Length of the high speed framework.</p>
</li>
<li>
<p><em>device_framework_full_speed</em>: Pointer to the full speed framework.</p>
</li>
<li>
<p><em>device_framework_length_full_speed</em>: Length of the full speed framework.</p>
</li>
<li>
<p><em>string_framework</em>: Pointer to string framework.</p>
</li>
<li>
<p><em>string_framework_length</em>: Length of string framework.</p>
</li>
<li>
<p><em>language_id_framework</em>: Pointer to string language framework.</p>
</li>
<li>
<p><em>language_id_framework_length</em>: Length of the string language framework.</p>
</li>
<li>
<p><em>ux_system_slave_change_function</em>: Function to be called when the device state changes.</p>
</li>
</ul>
</div>
<h3 id="_return_values_7" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) This operation was successful.</p>
</li>
<li>
<p><strong>UX_MEMORY_INSUFFICIENT</strong> (0x12) Not enough memory to initialize the stack.</p>
</li>
<li>
<p><strong>UX_DESCRIPTOR_CORRUPTED</strong> (0x42) The descriptor is invalid.</p>
</li>
</ul>
</div>
<h3 id="_example_11" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">/* Example of a device framework */

#define DEVICE_FRAMEWORK_LENGTH_FULL_SPEED 50

UCHAR device_framework_full_speed[] = {
    /* Device descriptor */
    0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08,
    0xec, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x01,

    /* Configuration descriptor */
    0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0xc0,
    0x32,

    /* Interface descriptor */
    0x09, 0x04, 0x00, 0x00, 0x02, 0x08, 0x06, 0x50,
    0x00,

    /* Endpoint descriptor (Bulk Out) */
    0x07, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00,

    /* Endpoint descriptor (Bulk In) */
    0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00
};

#define DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED 60

UCHAR device_framework_high_speed[] = {
    /* Device descriptor */
    0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40,
    0x0a, 0x07, 0x25, 0x40, 0x01, 0x00, 0x01, 0x02,
    0x03, 0x01,

    /* Device qualifier descriptor */
    0x0a, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40,
    0x01, 0x00,

    /* Configuration descriptor */
    0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0xc0,
    0x32,

    /* Interface descriptor */
    0x09, 0x04, 0x00, 0x00, 0x02, 0x08, 0x06, 0x50,
    0x00,

    /* Endpoint descriptor (Bulk Out) */
    0x07, 0x05, 0x01, 0x02, 0x00, 0x02, 0x00,

    /* Endpoint descriptor (Bulk In) */
    0x07, 0x05, 0x82, 0x02, 0x00, 0x02, 0x00
};

/* String Device Framework:
    Byte 0 and 1: Word containing the language ID: 0x0904 for US
    Byte 2 : Byte containing the index of the descriptor
    Byte 3 : Byte containing the length of the descriptor string */

#define STRING_FRAMEWORK_LENGTH 38 UCHAR string_framework[] = {
    /* Manufacturer string descriptor: Index 1 */
    0x09, 0x04, 0x01, 0x0c,
    0x45, 0x78, 0x70, 0x72,0x65, 0x73, 0x20, 0x4c,
    0x6f, 0x67, 0x69, 0x63,

    /* Product string descriptor: Index 2 */
    0x09, 0x04, 0x02, 0x0c,
    0x4D, 0x4C, 0x36, 0x39, 0x36, 0x35, 0x30, 0x30,
    0x20, 0x53, 0x44, 0x4B,

    /* Serial Number string descriptor: Index 3 */
    0x09, 0x04, 0x03, 0x04,
    0x30, 0x30, 0x30, 0x31
};

/* Multiple languages are supported on the device, to add a language besides English,
  the Unicode language code must be appended to the language_id_framework array
  and the length adjusted accordingly. */

#define LANGUAGE_ID_FRAMEWORK_LENGTH 2

UCHAR language_id_framework[] = {
    /* English. */
    0x09, 0x04
};</code></pre>
</div>
</div>
<div class="paragraph">
<p>The application can request a call back when the controller changes its state. The two main states for the controller are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>UX_DEVICE_SUSPENDED</strong></p>
</li>
<li>
<p><strong>UX_DEVICE_RESUMED</strong></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If the application does not need Suspend/Resume signals, it would supply a UX_NULL function.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The code below is required for installing the device portion of USBX.
    There is no call back for device status change in this example. */
status = ux_device_stack_initialize(&amp;device_framework_high_speed,
    DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED, &amp;device_framework_full_speed,
    DEVICE_FRAMEWORK_LENGTH_FULL_SPEED, &amp;string_framework,
    STRING_FRAMEWORK_LENGTH, &amp;language_id_framework,
    LANGUAGE_ID_FRAMEWORK_LENGTH, UX_NULL);

/* If status equals UX_SUCCESS, initialization was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_interface_delete" class="discrete">ux_device_stack_interface_delete</h3>
<div class="paragraph">
<p>Delete a stack interface</p>
</div>
<h3 id="_prototype_12" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_interface_delete(UX_SLAVE_INTERFACE*interface);</code></pre>
</div>
</div>
<h3 id="_description_12" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called when an interface should be removed. An interface is either removed when a device is extracted, or following a bus reset, or when there is a new alternate setting.</p>
</div>
<h3 id="_input_parameter_7" class="discrete">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>interface</em>: Pointer to the interface to remove.</p>
</li>
</ul>
</div>
<h3 id="_return_value_5" class="discrete">Return Value</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) This operation was successful.</p>
</li>
</ul>
</div>
<h3 id="_example_12" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_interface_delete(interface);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_interface_get" class="discrete">ux_device_stack_interface_get</h3>
<div class="paragraph">
<p>Get the current interface value</p>
</div>
<h3 id="_prototype_13" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_interface_get(UINT interface_value);</code></pre>
</div>
</div>
<h3 id="_description_13" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called when the host queries the current interface. The device returns the current interface value by transfer in background and returns immediately.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
This function is deprecated. It is available for legacy software, but new software should use the <strong><em>ux_device_stack_alternate_setting_get</em></strong> function instead.
</td>
</tr>
</table>
</div>
<h3 id="_input_parameter_8" class="discrete">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>interface_value</em>: Interface value to return.</p>
</li>
</ul>
</div>
<h3 id="_return_values_8" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) This operation was successful.</p>
</li>
<li>
<p><strong>UX_ERROR</strong> (0xFF) No interface exists.</p>
</li>
</ul>
</div>
<h3 id="_example_13" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">ULONG interface_value;

UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_interface_get(interface_value);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_interface_set" class="discrete">ux_device_stack_interface_set</h3>
<div class="paragraph">
<p>Change the alternate setting of the interface</p>
</div>
<h3 id="_prototype_14" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_interface_set(
    UCHAR *device_framework,
    ULONG device_framework_length,
    ULONG alternate_setting_value);</code></pre>
</div>
</div>
<h3 id="_description_14" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called when the host requests a change of the alternate setting for the interface.</p>
</div>
<div class="paragraph">
<p>This function starts status stage of the control transfer in background, and return immediately.</p>
</div>
<h3 id="_parameters_6" class="discrete">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>device_framework</em>: Address of the device framework for this interface.</p>
</li>
<li>
<p><em>device_framework_length</em>: Length of the device framework.</p>
</li>
<li>
<p><em>alternate_setting_value</em>: Alternate setting value to be used by this interface.</p>
</li>
</ul>
</div>
<h3 id="_return_values_9" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) This operation was successful.</p>
</li>
<li>
<p><strong>UX_ERROR</strong> (0xFF) No interface exists.</p>
</li>
</ul>
</div>
<h3 id="_example_14" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UCHAR * device_framework
ULONG device_framework_length;
ULONG alternate_setting_value;
UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_interface_set(device_framework,
    device_framework_length, alternate_setting_value);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_interface_start" class="discrete">ux_device_stack_interface_start</h3>
<div class="paragraph">
<p>Start search for a class to own an interface instance</p>
</div>
<h3 id="_prototype_15" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_interface_start(UX_SLAVE_INTERFACE*interface);</code></pre>
</div>
</div>
<h3 id="_description_15" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called when an interface has been selected by the host and the device stack needs to search for a device class to own this interface instance.</p>
</div>
<div class="paragraph">
<p>The device stack will issue a <strong>UX_SLAVE_CLASS_COMMAND_QUERY</strong> to the class that owns this interface to check if class match.</p>
</div>
<div class="paragraph">
<p>This function is not blocking and returns immediately.</p>
</div>
<h3 id="_input_parameter_9" class="discrete">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>interface</em>: Pointer to the interface created.</p>
</li>
</ul>
</div>
<h3 id="_return_values_10" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) This operation was successful.</p>
</li>
<li>
<p><strong>UX_NO_CLASS_MATCH</strong> (0x57) No class exists for this interface.</p>
</li>
</ul>
</div>
<h3 id="_example_15" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates this service. */
status = ux_device_stack_interface_start(interface);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_transfer_request" class="discrete">ux_device_stack_transfer_request</h3>
<div class="paragraph">
<p>Request to transfer data to the host</p>
</div>
<h3 id="_prototype_16" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_transfer_request(
    UX_SLAVE_TRANSFER *transfer_request,
    ULONG slave_length,
    ULONG host_length);</code></pre>
</div>
</div>
<h3 id="_description_16" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called when a class or the stack wants to transfer data to the host. The host always polls the device but the device can prepare data in advance.</p>
</div>
<div class="paragraph">
<p>This function starts transfer in background and return immediately if endpoint is in normal state. If non-control endpoint is halted, when function is invoked, it waits the halt state to be cleared to continue starting transfer.</p>
</div>
<h3 id="_parameters_7" class="discrete">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>transfer_request</em>: Pointer to the transfer request.</p>
</li>
<li>
<p><em>slave_length</em>: Length the device wants to return.</p>
</li>
<li>
<p><em>host_length</em>: Length the host has requested.</p>
</li>
</ul>
</div>
<h3 id="_return_values_11" class="discrete">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) This operation was successful.</p>
</li>
<li>
<p><strong>UX_TRANSFER_NOT_READY</strong> (0x25) The device is in an invalid state; it must be <strong>ATTACHED</strong>, <strong>CONFIGURED</strong>, or <strong>ADDRESSED</strong>.</p>
</li>
<li>
<p><strong>UX_ERROR</strong> (0xFF) Transport error.</p>
</li>
</ul>
</div>
<h3 id="_example_16" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates how to transfer more data than an application requests. */
while(total_length) {
    /* How much can we send in this transfer? */
    if (total_length &gt; UX_SLAVE_CLASS_STORAGE_BUFFER_SIZE)
        transfer_length = UX_SLAVE_CLASS_STORAGE_BUFFER_SIZE;
    else
        transfer_length = total_length;

   /* Copy the Storage Buffer into the transfer request memory. */
   ux_utility_memory_copy(transfer_request -&gt;  ux_slave_transfer_request_data_pointer,
       media_memory, transfer_length);

   /* Send the data payload back to the caller. */
   status = ux_device_transfer_request(transfer_request,
       transfer_length, transfer_length);

   /* If status equals UX_SUCCESS, the operation was successful. */

   /* Update the buffer address.  */
    media_memory += transfer_length;

   /* Update the length to remain. */
    total_length -= transfer_length;
}</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_transfer_abort" class="discrete">ux_device_stack_transfer_abort</h3>
<div class="paragraph">
<p>Cancel a transfer request</p>
</div>
<h3 id="_prototype_17" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_transfer_abort(
    UX_SLAVE_TRANSFER *transfer_request,
    ULONG completion_code);</code></pre>
</div>
</div>
<h3 id="_description_17" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called when an application needs to cancel a transfer request or when the stack needs to abort a transfer request associated with an endpoint, and return immediately.</p>
</div>
<h3 id="_parameters_8" class="discrete">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>transfer_request</em>: Pointer to the transfer request.</p>
</li>
<li>
<p><em>completion_code</em>: Error code to be returned to the class waiting for this transfer request to complete.</p>
</li>
</ul>
</div>
<h3 id="_return_value_6" class="discrete">Return Value</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) This operation was successful.</p>
</li>
</ul>
</div>
<h3 id="_example_17" class="discrete">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates how to abort a transfer when a
    bus reset has been detected on the bus. */
status = ux_device_stack_transfer_abort(transfer_request, UX_TRANSFER_BUS_RESET);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
<h3 id="_ux_device_stack_uninitialize" class="discrete">ux_device_stack_uninitialize</h3>
<div class="paragraph">
<p>Unitialize stack</p>
</div>
<h3 id="_prototype_18" class="discrete">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_device_stack_uninitialize();</code></pre>
</div>
</div>
<h3 id="_description_18" class="discrete">Description</h3>
<div class="paragraph">
<p>This function is called when an application needs to unitialize the USBX device stack&#8201;&#8212;&#8201;all device stack resources are freed, and return immediately. This should be called after all classes have been unregistered via ux_device_stack_class_unregister.</p>
</div>
<h3 id="_parameters_9" class="discrete">Parameters</h3>
<div class="paragraph">
<p>None</p>
</div>
<h3 id="_return_value_7" class="discrete">Return Value</h3>
<div class="paragraph">
<p><strong>UX_SUCCESS</strong> (0x00) This operation was successful.</p>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2025-02-07 08:25:21 UTC
</div>
</div>
</body>
</html>